package com.cpimex.eprice;

import java.util.*;
import java.sql.*;
import com.cpimex.eprice.bean.PerfilBean;
import com.cpimex.eprice.bean.DirigidoBean;
import com.cpimex.eprice.bean.EstatusBean;
import com.cpimex.eprice.bean.OtroCorreoBean;

public class MatrizCorreo {
    public ArrayList listarEstatus(Statement stmt, String str_estatus) throws
            SQLException {
        Estatus estatus = new Estatus();
        ArrayList arr_estatus = estatus.listarEstatus(stmt, "");
        return arr_estatus;
    }


    private ArrayList listarPerfil(Statement stmt, String str_idEstatus, String str_idDirigido) throws SQLException {
        ArrayList arr_perfil = new ArrayList();
        String str_query = " SELECT mc.id_matrizCorreo, " +
                           "        mc.id_dirigidoCorreo, " +
                           "        mc.id_perfil,  " +
                           "        vp.desc_perfil " +
                           " FROM ep_matrizCorreo mc " +
                           "        INNER JOIN ep_vw_perfil vp " +
                           "        ON mc.id_perfil = vp.id_perfil " +
                           " WHERE mc.id_estatus = '"+str_idEstatus+"' " +
                           " AND mc.id_dirigidoCorreo = '"+str_idDirigido+"' ";

        ResultSet rs = stmt.executeQuery(str_query);
        while(rs.next()){
            PerfilBean bn_perfil = new PerfilBean();
            String str_idPerfil = rs.getString("id_perfil");
            String str_descPerfil = rs.getString("desc_perfil");

            bn_perfil.setStr_idPerfil(str_idPerfil);
            bn_perfil.setStr_descPerfil(str_descPerfil);

            arr_perfil.add(bn_perfil);
        }
        return (ArrayList) arr_perfil;
    }



    private ArrayList listarDirigido(Statement stmt, String str_idEstatus) throws SQLException {
        ArrayList arr_dirigido = new ArrayList();
        String str_query = " SELECT id_dirigidoCorreo, "+
                           "        descripcion_dirigidoCorreo" +
                           " FROM ep_dirigidoCorreo ";

        ResultSet rs = stmt.executeQuery(str_query);

        while(rs.next()){
            String str_idDirigido = rs.getString("id_dirigidoCorreo");
            String str_descDirigido = rs.getString("descripcion_dirigidoCorreo");
            Map map_url = new HashMap();
            map_url.put("action", "editarMatriz" );
            map_url.put("str_idEstatus", str_idEstatus);
            map_url.put("str_idDirigido", str_idDirigido);

            DirigidoBean bn_dir = new DirigidoBean();
            bn_dir.setStr_idDirigido(str_idDirigido);
            bn_dir.setStr_descDirigido(str_descDirigido);
            bn_dir.setMap_urlEditar(map_url);

            arr_dirigido.add(bn_dir);
        }
        return (ArrayList) arr_dirigido;
    }

    public ArrayList listarOtro(Statement stmt, String str_idEstatus, String str_idDirigido) throws SQLException {
        ArrayList arr_otro = new ArrayList();
        String str_query = " SELECT  oc.id_estatusOtroCorreo,                      " +
                           "         oc.mail_estatusOtroCorreo,                    " +
                           "         vu.nomina_usuario,                            " +
                           "         vu.nombre_usuario                             " +
                           " FROM ep_estatusOtroCorreo oc                          " +
                           "      INNER JOIN ep_vw_usuario vu                      " +
                           "      ON oc.mail_estatusOtroCorreo = vu.nomina_usuario " +
                           "     WHERE oc.id_estatus = '"+str_idEstatus+"'  AND    " +
                           "           oc.id_dirigidoCorreo = '"+str_idDirigido+"' ";

        ResultSet rs = stmt.executeQuery(str_query);

        if(rs.next()){
            String str_idEstatusOtro = rs.getString("id_estatusOtroCorreo");
            String str_mail_estatusOtroCorreo = rs.getString("mail_estatusOtroCorreo");
            String str_nominaUsuario = rs.getString("nomina_usuario");
            String str_nombreUsuario = rs.getString("nombre_usuario");

            OtroCorreoBean bn_otro = new OtroCorreoBean();
            bn_otro.setStr_idEstatusOtro(str_idEstatusOtro);
            bn_otro.setStr_mailEstatusOtro(str_mail_estatusOtroCorreo);
            bn_otro.setStr_nominaUsuario(str_nominaUsuario);
            bn_otro.setStr_nombreUsuario(str_nombreUsuario);
            arr_otro.add(bn_otro);
        }
        return arr_otro;
    }


    private void insertarOtro(Statement stmt, String str_idEstatus,
                              String str_idDirigido, String str_perfil) throws
            SQLException {
        if(!str_perfil.equals("")){
            String str_query = " INSERT INTO ep_estatusOtroCorreo( id_estatus,                             " +
                               "                                   id_dirigidoCorreo,                      " +
                               "                                   mail_EstatusOtroCorreo)                 " +
                               "        VALUES('"+str_idEstatus+"', '"+str_idDirigido+"', '"+str_perfil+"')" ;
            stmt.executeUpdate(str_query);
        }
    }


    private void eliminarOtro(Statement stmt, String str_idEstatus,
                              String str_idDirigido) throws SQLException {
        String str_query = " DELETE FROM ep_estatusOtroCorreo                      " +
                           "        WHERE id_estatus = '"+str_idEstatus+"' AND     " +
                           "              id_dirigidoCorreo = '"+str_idDirigido+"' ";
        stmt.executeUpdate(str_query);

    }

    public void actualizarOtro(Statement stmt, String str_idEstatus,
                              String str_idDirigido, String str_perfil) throws
            SQLException {
       eliminarOtro(stmt,str_idEstatus,str_idDirigido);
       insertarOtro(stmt,str_idEstatus,str_idDirigido, str_perfil);
   }


    public ArrayList listarMatriz(Statement stmt) throws SQLException {
        ArrayList arr_matriz  =   new ArrayList();
        ArrayList arr_per     =   new ArrayList();
        ArrayList arr_dir     =   new ArrayList();
        ArrayList arr_otro    =   new ArrayList();

        ArrayList arr_estatus = listarEstatus(stmt, "");
        Iterator it_estatus =  arr_estatus.iterator();
        while(it_estatus.hasNext()){
            EstatusBean bn_estatus = (EstatusBean)it_estatus.next();

            arr_dir = listarDirigido(stmt, bn_estatus.getStr_idEstatus());
            Iterator it_dirigido = arr_dir.iterator();

            while(it_dirigido.hasNext()){
                DirigidoBean bn_dir = (DirigidoBean)it_dirigido.next();
                arr_per = listarPerfil(stmt, bn_estatus.getStr_idEstatus(), bn_dir.getStr_idDirigido() );
                bn_dir.setArr_perfil(arr_per);

                arr_otro = listarOtro(stmt, bn_estatus.getStr_idEstatus(), bn_dir.getStr_idDirigido() );
                bn_dir.setArr_otro(arr_otro);
            }
            bn_estatus.setArr_dirigido(arr_dir);
            arr_matriz.add(bn_estatus);
        }
        return arr_matriz;
    }


    public ArrayList listarPerfiles(Statement stmt, String str_idEstatus, String str_idDirigido) throws SQLException {
        ArrayList arr_perfil = new ArrayList();
        String str_query = " SELECT vp.id_perfil,                                                             " +
                           "        vp.desc_perfil,                                                           " +
                           "     CASE                                                                         " +
                           "        WHEN vp.id_perfil not in( SELECT id_perfil                                " +
                           "                                  FROM ep_matrizCorreo                            " +
                           "                                  WHERE id_estatus = '"+str_idEstatus+"' AND      " +
                           "                                        id_dirigidoCorreo ='"+str_idDirigido+"')  " +
                           "        THEN null                                                                 " +
                           "        ELSE id_perfil                                                            " +
                           "     END perfil_sel,                                                               " +
                           "     CASE                                                                         " +
                           "        WHEN vp.id_perfil not in( SELECT id_perfil                                " +
                           "                                  FROM ep_matrizCorreo                            " +
                           "                                  WHERE id_estatus = '"+str_idEstatus+"' AND      " +
                           "                                        id_dirigidoCorreo !='"+str_idDirigido+"') " +
                           "        THEN  'true'                                                              " +
                           "        ELSE  'false'                                                             " +
                           "     END bloqueo                                                                  " +
                           " FROM ep_vw_perfil vp  WHERE vp.id_perfil != 162                                  ";

        ResultSet rs = stmt.executeQuery(str_query);

        while(rs.next()){
            String str_idPerfil   =  rs.getString("id_perfil");
            String str_descPerfil =  rs.getString("desc_perfil");
            //boolean bool_checked  =  (rs.getString("checked").endsWith("0")?false:true);
            String str_idPerfilS   =  rs.getString("perfil_sel");
            String str_idPerfilSlctd = rs.getString("bloqueo");

            PerfilBean bn_perfil = new PerfilBean();
            bn_perfil.setStr_idPerfil(str_idPerfil);
            bn_perfil.setStr_descPerfil(str_descPerfil);
            //bn_perfil.setBool_checked(bool_checked);
            bn_perfil.setStr_idPerfilS(str_idPerfilS);
            bn_perfil.setStr_idPerfilSlctd(str_idPerfilSlctd);

            arr_perfil.add(bn_perfil);
        }
        return arr_perfil;
    }


    private void insertaPerfil(Statement stmt, String str_idPerfil,
                                String str_idEstatus, String str_idDirigido) throws
           SQLException {
       String str_query;

           str_query = "INSERT INTO ep_matrizCorreo(id_perfil, " +
                       "                            id_estatus, " +
                       "                            id_dirigidoCorreo)" +
                       "            VALUES('"+str_idPerfil+"', " +
                       "                   '"+str_idEstatus+"', " +
                       "                   '"+str_idDirigido+"')";
           stmt.executeUpdate(str_query) ;
   }

   private void eliminaPerfil(Statement stmt, String str_idEstatus, String str_idDirigido) throws
            SQLException {
       String str_query = " DELETE fROM ep_matrizCorreo" +
                          " WHERE id_estatus = '"+str_idEstatus+"' "+
                          " AND  id_dirigidoCorreo = '"+str_idDirigido+"'";
       stmt.executeUpdate(str_query);
   }

   public void actualizarPerfil(Statement stmt, String[] str_idPerfilS, String str_idEstatus, String str_idDirigido) throws SQLException {
       eliminaPerfil(stmt, str_idEstatus, str_idDirigido );

       if(str_idPerfilS!=null)
           for (int int_i = 0; int_i < str_idPerfilS.length; int_i++) {
               insertaPerfil(stmt, str_idPerfilS[int_i], str_idEstatus,
                             str_idDirigido);
           }
   }

   public ArrayList listarUsuario(Statement stmt, String str_search) throws
            SQLException {
       ArrayList arr_usuario = new ArrayList();
       String str_query = " SELECT nomina_usuario, "+
                          "        nombre_usuario "+
                          " FROM ep_vw_usuario " +
                          " WHERE nomina_usuario LIKE '%"+str_search+"%' OR " +
                          "       nombre_usuario LIKE '%"+str_search+"%'";

       ResultSet rs= stmt.executeQuery(str_query);
       while(rs.next()){
           String str_nominaUsuario = rs.getString("nomina_usuario");
           String str_nombreUsuario = rs.getString("nombre_usuario");

           PerfilBean bn_perfil = new PerfilBean();
           bn_perfil.setStr_nomina(str_nominaUsuario);
           bn_perfil.setStr_nombreUsuario(str_nombreUsuario);
           arr_usuario.add(bn_perfil);
       }
       return arr_usuario;
   }
}
